package org.hentor.modules.generate.utils;

import java.util.*;

/**
 * 关键字校验
 */
public class KeywordValidator {
    private static final Set<String> JAVA_KEYWORDS = new HashSet<>();
    private static final Set<String> MYSQL_KEYWORDS = new HashSet<>();
    static {
        // Java 关键字
        JAVA_KEYWORDS.add("abstract");
        JAVA_KEYWORDS.add("assert");
        JAVA_KEYWORDS.add("boolean");
        JAVA_KEYWORDS.add("break");
        JAVA_KEYWORDS.add("byte");
        JAVA_KEYWORDS.add("case");
        JAVA_KEYWORDS.add("catch");
        JAVA_KEYWORDS.add("char");
        JAVA_KEYWORDS.add("class");
        JAVA_KEYWORDS.add("const");
        JAVA_KEYWORDS.add("continue");
        JAVA_KEYWORDS.add("default");
        JAVA_KEYWORDS.add("do");
        JAVA_KEYWORDS.add("double");
        JAVA_KEYWORDS.add("else");
        JAVA_KEYWORDS.add("enum");
        JAVA_KEYWORDS.add("extends");
        JAVA_KEYWORDS.add("final");
        JAVA_KEYWORDS.add("finally");
        JAVA_KEYWORDS.add("float");
        JAVA_KEYWORDS.add("for");
        JAVA_KEYWORDS.add("if");
        JAVA_KEYWORDS.add("implements");
        JAVA_KEYWORDS.add("import");
        JAVA_KEYWORDS.add("instanceof");
        JAVA_KEYWORDS.add("int");
        JAVA_KEYWORDS.add("interface");
        JAVA_KEYWORDS.add("long");
        JAVA_KEYWORDS.add("native");
        JAVA_KEYWORDS.add("new");
        JAVA_KEYWORDS.add("package");
        JAVA_KEYWORDS.add("private");
        JAVA_KEYWORDS.add("protected");
        JAVA_KEYWORDS.add("public");
        JAVA_KEYWORDS.add("return");
        JAVA_KEYWORDS.add("short");
        JAVA_KEYWORDS.add("static");
        JAVA_KEYWORDS.add("strictfp");
        JAVA_KEYWORDS.add("super");
        JAVA_KEYWORDS.add("switch");
        JAVA_KEYWORDS.add("synchronized");
        JAVA_KEYWORDS.add("this");
        JAVA_KEYWORDS.add("throw");
        JAVA_KEYWORDS.add("throws");
        JAVA_KEYWORDS.add("transient");
        JAVA_KEYWORDS.add("try");
        JAVA_KEYWORDS.add("void");
        JAVA_KEYWORDS.add("volatile");
        JAVA_KEYWORDS.add("while");

        //mysql关键字
        MYSQL_KEYWORDS.add("ADD");
        MYSQL_KEYWORDS.add("ALL");
        MYSQL_KEYWORDS.add("ALTER");
        MYSQL_KEYWORDS.add("ANALYZE");
        MYSQL_KEYWORDS.add("AND");
        MYSQL_KEYWORDS.add("AS");
        MYSQL_KEYWORDS.add("ASC");
        MYSQL_KEYWORDS.add("BEFORE");
        MYSQL_KEYWORDS.add("BETWEEN");
        MYSQL_KEYWORDS.add("BIGINT");
        MYSQL_KEYWORDS.add("BINARY");
        MYSQL_KEYWORDS.add("BLOB");
        MYSQL_KEYWORDS.add("BOTH");
        MYSQL_KEYWORDS.add("BY");
        MYSQL_KEYWORDS.add("CALL");
        MYSQL_KEYWORDS.add("CASCADE");
        MYSQL_KEYWORDS.add("CASE");
        MYSQL_KEYWORDS.add("CHANGE");
        MYSQL_KEYWORDS.add("CHAR");
        MYSQL_KEYWORDS.add("CHARACTER");
        MYSQL_KEYWORDS.add("CHECK");
        MYSQL_KEYWORDS.add("COLLATE");
        MYSQL_KEYWORDS.add("COLUMN");
        MYSQL_KEYWORDS.add("CONDITION");
        MYSQL_KEYWORDS.add("CONSTRAINT");
        MYSQL_KEYWORDS.add("CONTINUE");
        MYSQL_KEYWORDS.add("CONVERT");
        MYSQL_KEYWORDS.add("CREATE");
        MYSQL_KEYWORDS.add("CROSS");
        MYSQL_KEYWORDS.add("CURRENT_DATE");
        MYSQL_KEYWORDS.add("CURRENT_TIME");
        MYSQL_KEYWORDS.add("CURRENT_TIMESTAMP");
        MYSQL_KEYWORDS.add("CURRENT_USER");
        MYSQL_KEYWORDS.add("CURSOR");
        MYSQL_KEYWORDS.add("DATABASE");
        MYSQL_KEYWORDS.add("DATABASES");
        MYSQL_KEYWORDS.add("DAY_HOUR");
        MYSQL_KEYWORDS.add("DAY_MICROSECOND");
        MYSQL_KEYWORDS.add("DAY_MINUTE");
        MYSQL_KEYWORDS.add("DAY_SECOND");
        MYSQL_KEYWORDS.add("DEC");
        MYSQL_KEYWORDS.add("DECIMAL");
        MYSQL_KEYWORDS.add("DECLARE");
        MYSQL_KEYWORDS.add("DEFAULT");
        MYSQL_KEYWORDS.add("DELAYED");
        MYSQL_KEYWORDS.add("DELETE");
        MYSQL_KEYWORDS.add("DESC");
        MYSQL_KEYWORDS.add("DESCRIBE");
        MYSQL_KEYWORDS.add("DETERMINISTIC");
        MYSQL_KEYWORDS.add("DISTINCT");
        MYSQL_KEYWORDS.add("DISTINCTROW");
        MYSQL_KEYWORDS.add("DIV");
        MYSQL_KEYWORDS.add("DOUBLE");
        MYSQL_KEYWORDS.add("DROP");
        MYSQL_KEYWORDS.add("DUAL");
        MYSQL_KEYWORDS.add("EACH");
        MYSQL_KEYWORDS.add("ELSE");
        MYSQL_KEYWORDS.add("ELSEIF");
        MYSQL_KEYWORDS.add("ENCLOSED");
        MYSQL_KEYWORDS.add("ESCAPED");
        MYSQL_KEYWORDS.add("EXISTS");
        MYSQL_KEYWORDS.add("EXIT");
        MYSQL_KEYWORDS.add("EXPLAIN");
        MYSQL_KEYWORDS.add("FALSE");
        MYSQL_KEYWORDS.add("FETCH");
        MYSQL_KEYWORDS.add("FLOAT");
        MYSQL_KEYWORDS.add("FLOAT4");
        MYSQL_KEYWORDS.add("FLOAT8");
        MYSQL_KEYWORDS.add("FOR");
        MYSQL_KEYWORDS.add("FORCE");
        MYSQL_KEYWORDS.add("FOREIGN");
        MYSQL_KEYWORDS.add("FROM");
        MYSQL_KEYWORDS.add("FULLTEXT");
        MYSQL_KEYWORDS.add("GENERAL");
        MYSQL_KEYWORDS.add("GRANT");
        MYSQL_KEYWORDS.add("GROUP");
        MYSQL_KEYWORDS.add("HAVING");
        MYSQL_KEYWORDS.add("HIGH_PRIORITY");
        MYSQL_KEYWORDS.add("HOUR_MICROSECOND");
        MYSQL_KEYWORDS.add("HOUR_MINUTE");
        MYSQL_KEYWORDS.add("HOUR_SECOND");
        MYSQL_KEYWORDS.add("IF");
        MYSQL_KEYWORDS.add("IGNORE");
        MYSQL_KEYWORDS.add("IN");
        MYSQL_KEYWORDS.add("INDEX");
        MYSQL_KEYWORDS.add("INFILE");
        MYSQL_KEYWORDS.add("INNER");
        MYSQL_KEYWORDS.add("INOUT");
        MYSQL_KEYWORDS.add("INSENSITIVE");
        MYSQL_KEYWORDS.add("INSERT");
        MYSQL_KEYWORDS.add("INT");
        MYSQL_KEYWORDS.add("INT1");
        MYSQL_KEYWORDS.add("INT2");
        MYSQL_KEYWORDS.add("INT3");
        MYSQL_KEYWORDS.add("INT4");
        MYSQL_KEYWORDS.add("INT8");
        MYSQL_KEYWORDS.add("INTEGER");
        MYSQL_KEYWORDS.add("INTERVAL");
        MYSQL_KEYWORDS.add("INTO");
        MYSQL_KEYWORDS.add("IS");
        MYSQL_KEYWORDS.add("ITERATE");
        MYSQL_KEYWORDS.add("JOIN");
        MYSQL_KEYWORDS.add("KEY");
        MYSQL_KEYWORDS.add("KEYS");
        MYSQL_KEYWORDS.add("KILL");
        MYSQL_KEYWORDS.add("LEADING");
        MYSQL_KEYWORDS.add("LEAVE");
        MYSQL_KEYWORDS.add("LEFT");
        MYSQL_KEYWORDS.add("LIKE");
        MYSQL_KEYWORDS.add("LIMIT");
        MYSQL_KEYWORDS.add("LINEAR");
        MYSQL_KEYWORDS.add("LINES");
        MYSQL_KEYWORDS.add("LOAD");
        MYSQL_KEYWORDS.add("LOCALTIME");
        MYSQL_KEYWORDS.add("LOCALTIMESTAMP");
        MYSQL_KEYWORDS.add("LOCK");
        MYSQL_KEYWORDS.add("LONG");
        MYSQL_KEYWORDS.add("LONGBLOB");
        MYSQL_KEYWORDS.add("LONGTEXT");
        MYSQL_KEYWORDS.add("LOOP");
        MYSQL_KEYWORDS.add("LOW_PRIORITY");
        MYSQL_KEYWORDS.add("MASTER_SSL_VERIFY_SERVER_CERT");
        MYSQL_KEYWORDS.add("MATCH");
        MYSQL_KEYWORDS.add("MEDIUMBLOB");
        MYSQL_KEYWORDS.add("MEDIUMINT");
        MYSQL_KEYWORDS.add("MEDIUMTEXT");
        MYSQL_KEYWORDS.add("MIDDLEINT");
        MYSQL_KEYWORDS.add("MINUTE_MICROSECOND");
        MYSQL_KEYWORDS.add("MINUTE_SECOND");
        MYSQL_KEYWORDS.add("MOD");
        MYSQL_KEYWORDS.add("MODIFIES");
        MYSQL_KEYWORDS.add("NATURAL");
        MYSQL_KEYWORDS.add("NOT");
        MYSQL_KEYWORDS.add("NO_WRITE_TO_BINLOG");
        MYSQL_KEYWORDS.add("NULL");
        MYSQL_KEYWORDS.add("NUMERIC");
        MYSQL_KEYWORDS.add("ON");
        MYSQL_KEYWORDS.add("OPTIMIZE");
        MYSQL_KEYWORDS.add("OPTION");
        MYSQL_KEYWORDS.add("OPTIONALLY");
        MYSQL_KEYWORDS.add("OR");
        MYSQL_KEYWORDS.add("ORDER");
        MYSQL_KEYWORDS.add("OUT");
        MYSQL_KEYWORDS.add("OUTER");
        MYSQL_KEYWORDS.add("OUTFILE");
        MYSQL_KEYWORDS.add("PRECISION");
        MYSQL_KEYWORDS.add("PRIMARY");
        MYSQL_KEYWORDS.add("PROCEDURE");
        MYSQL_KEYWORDS.add("PURGE");
        MYSQL_KEYWORDS.add("RANGE");
        MYSQL_KEYWORDS.add("READ");
        MYSQL_KEYWORDS.add("READS");
        MYSQL_KEYWORDS.add("READ_WRITE");
        MYSQL_KEYWORDS.add("REAL");
        MYSQL_KEYWORDS.add("REFERENCES");
        MYSQL_KEYWORDS.add("REGEXP");
        MYSQL_KEYWORDS.add("RELEASE");
        MYSQL_KEYWORDS.add("RENAME");
        MYSQL_KEYWORDS.add("REPEAT");
        MYSQL_KEYWORDS.add("REPLACE");
        MYSQL_KEYWORDS.add("REQUIRE");
        MYSQL_KEYWORDS.add("RESTRICT");
        MYSQL_KEYWORDS.add("RETURN");
        MYSQL_KEYWORDS.add("REVOKE");
        MYSQL_KEYWORDS.add("RIGHT");
        MYSQL_KEYWORDS.add("RLIKE");
        MYSQL_KEYWORDS.add("SCHEMA");
        MYSQL_KEYWORDS.add("SCHEMAS");
        MYSQL_KEYWORDS.add("SECOND_MICROSECOND");
        MYSQL_KEYWORDS.add("SELECT");
        MYSQL_KEYWORDS.add("SENSITIVE");
        MYSQL_KEYWORDS.add("SEPARATOR");
        MYSQL_KEYWORDS.add("SET");
        MYSQL_KEYWORDS.add("SHOW");
        MYSQL_KEYWORDS.add("SMALLINT");
        MYSQL_KEYWORDS.add("SONAME");
        MYSQL_KEYWORDS.add("SPATIAL");
        MYSQL_KEYWORDS.add("SPECIFIC");
        MYSQL_KEYWORDS.add("SQL");
        MYSQL_KEYWORDS.add("SQLEXCEPTION");
        MYSQL_KEYWORDS.add("SQLSTATE");
        MYSQL_KEYWORDS.add("SQLWARNING");
        MYSQL_KEYWORDS.add("SQL_BIG_RESULT");
        MYSQL_KEYWORDS.add("SQL_CALC_FOUND_ROWS");
        MYSQL_KEYWORDS.add("SQL_SMALL_RESULT");
        MYSQL_KEYWORDS.add("SSL");
        MYSQL_KEYWORDS.add("STARTING");
        MYSQL_KEYWORDS.add("STRAIGHT_JOIN");
        MYSQL_KEYWORDS.add("TABLE");
        MYSQL_KEYWORDS.add("TERMINATED");
        MYSQL_KEYWORDS.add("THEN");
        MYSQL_KEYWORDS.add("TINYBLOB");
        MYSQL_KEYWORDS.add("TINYINT");
        MYSQL_KEYWORDS.add("TINYTEXT");
        MYSQL_KEYWORDS.add("TO");
        MYSQL_KEYWORDS.add("TRAILING");
        MYSQL_KEYWORDS.add("TRIGGER");
        MYSQL_KEYWORDS.add("TRUE");
        MYSQL_KEYWORDS.add("UNDO");
        MYSQL_KEYWORDS.add("UNION");
        MYSQL_KEYWORDS.add("UNIQUE");
        MYSQL_KEYWORDS.add("UNLOCK");
        MYSQL_KEYWORDS.add("UNSIGNED");
        MYSQL_KEYWORDS.add("UPDATE");
        MYSQL_KEYWORDS.add("USAGE");
        MYSQL_KEYWORDS.add("USE");
        MYSQL_KEYWORDS.add("USING");
        MYSQL_KEYWORDS.add("UTC_DATE");
        MYSQL_KEYWORDS.add("UTC_TIME");
        MYSQL_KEYWORDS.add("UTC_TIMESTAMP");
        MYSQL_KEYWORDS.add("VALUES");
        MYSQL_KEYWORDS.add("VARBINARY");
        MYSQL_KEYWORDS.add("VARCHAR");
        MYSQL_KEYWORDS.add("VARCHARACTER");
        MYSQL_KEYWORDS.add("VARYING");
        MYSQL_KEYWORDS.add("WHEN");
        MYSQL_KEYWORDS.add("WHERE");
        MYSQL_KEYWORDS.add("WHILE");
        MYSQL_KEYWORDS.add("WITH");
        MYSQL_KEYWORDS.add("WRITE");
        MYSQL_KEYWORDS.add("XOR");
        MYSQL_KEYWORDS.add("YEAR_MONTH");
        MYSQL_KEYWORDS.add("ZEROFILL");
    }
    public static boolean isKeyword(String input) {
        List<String> lowercaseList = new ArrayList<>();
        for (String str : MYSQL_KEYWORDS) {
            lowercaseList.add(str.toLowerCase());
        }
        return JAVA_KEYWORDS.contains(input) || MYSQL_KEYWORDS.contains(input) || lowercaseList.contains(input);
    }
}
